﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using Fabrica10.Negocios;
using Database;

namespace WebService
{
    /// <summary>
    /// Summary description for Fabrica10
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Fabrica10 : System.Web.Services.WebService
    {

        #region Médicos, Fisioterapeuta, OutrosFuncionarios

        [WebMethod]
        public List<SerializedMedico> VisualizarMedicos()
        {
            try
            {
                List<SerializedMedico> listaMedicoSerializado = new List<SerializedMedico>();
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                List<Funcionario> listaFuncionario = new List<Funcionario>();
                listaFuncionario = gerenciamento.ListaFuncionarios(0, 1); //lista só médicos ativos

                foreach (var Funcionario in listaFuncionario)
                {
                    var MedicoSerializado = new SerializedMedico(Funcionario);
                    listaMedicoSerializado.Add(MedicoSerializado);
                }

                return listaMedicoSerializado;
            }
            catch (Exception)
            {
                return null;
            }
        }

        [WebMethod]
        public List<SerializedFisioterapeuta> VisualizarFisioterapeutas()
        {
            try
            {
                List<SerializedFisioterapeuta> listaFisioterapeutaSerializado = new List<SerializedFisioterapeuta>();
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                List<Funcionario> listaFuncionario = new List<Funcionario>();
                listaFuncionario = gerenciamento.ListaFuncionarios(1, 1); //lista só fisioterapeutas ativos

                foreach (var Funcionario in listaFuncionario)
                {
                    var FisioterapeutaSerializado = new SerializedFisioterapeuta(Funcionario);
                    listaFisioterapeutaSerializado.Add(FisioterapeutaSerializado);
                }

                return listaFisioterapeutaSerializado;
            }
            catch (Exception)
            {
                return null;
            }
        }

        [WebMethod]
        public List<SerializedFuncionario> VisualizarFuncionarios()
        {
            //var output = new Output<List<SerializedFuncionario>>();
            List<SerializedFuncionario> listaFuncionarioSerializado = new List<SerializedFuncionario>();

            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();

                var listaFuncionario = gerenciamento.ListaFuncionarios(3, 1); //lista só funcionarios ativos
                foreach (var Funcionario in listaFuncionario)
                {
                    var FuncionarioSerializado = new SerializedFuncionario(Funcionario);
                    listaFuncionarioSerializado.Add(FuncionarioSerializado);
                }
                return listaFuncionarioSerializado;

                //output.Value = listaFuncionarioSerializado;
            }
            catch (Exception)
            {
                //output.ErrorCode = ErrorCode.ParameterError;
                //output.ErrorMsg = ex.Message;
                return null;
            }
            //return output;
        }

        [WebMethod]
        public List<SerializedFuncionario> VisualizarFuncionariosPorNome(string nome)
        {
            try
            {
                var geren = new GerenciamentoFuncionarios();
                var funcs = geren.ListaFuncionarios(nome);
                var sFunc = new List<SerializedFuncionario>();
                foreach (var f in funcs)
                {
                    sFunc.Add(new SerializedFuncionario(f));
                }
                return sFunc;
            }
            catch (Exception)
            {
                return null;
            }           
        }


        [WebMethod]
        public bool DesativarFuncionario(int id)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                gerenciamento.DesativaFuncionario(id);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public SerializedMedico CadastrarMedico(int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                var medico = gerenciamento.CadastrarMedico(IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora);

                return new SerializedMedico(medico);
            }
            catch (Exception)
            {
                return null;
            }
        }

        [WebMethod]
        public SerializedFisioterapeuta CadastrarFisioterapeuta(int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                var fisiot = gerenciamento.CadastrarFisioterapeuta(IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora);
                return new SerializedFisioterapeuta(fisiot);
            }
            catch (Exception)
            {
                return null;
            }
        }

        [WebMethod]
        public SerializedFuncionario CadastrarOutrosFuncionarios(int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                var func = gerenciamento.CadastrarOutrosFuncionarios(IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora);
                return new SerializedFuncionario(func);
            }
            catch (Exception)
            {
                return null;
            }
        }

        [WebMethod]
        public bool AtualizarFuncionario(int IdFuncionario, int IdDepartamento, string Nome, string CPF, string Endereco, string Cidade, string Estado, string Telefone1, string Telefone2, string RG, decimal SalarioHora, string AtendimentoPaciente)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                gerenciamento.AtualizaFuncionario(IdFuncionario, IdDepartamento, Nome, CPF, Endereco, Cidade, Estado, Telefone1, Telefone2, RG, SalarioHora, AtendimentoPaciente);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public SerializedFuncionario GetFuncionario(int IdFuncionario)
        {
            try
            {
                GerenciamentoFuncionarios gerenciamento = new GerenciamentoFuncionarios();
                SerializedFuncionario funcionarioSerializado = new SerializedFuncionario(gerenciamento.GetFuncionario(IdFuncionario));
                return funcionarioSerializado;
            }
            catch (Exception) { return null; }
        }

        #endregion


        #region FolhaPagamento
        [WebMethod]
        public List<SerializedFolhaPagamento> VisualizarFolhaPagamento(int idFuncionario, DateTime dataInicial, DateTime dataFinal)
        {
            try
            {
                GerenciamentoFolhaPagamento gerenciamento = new GerenciamentoFolhaPagamento();
                List<FolhaDePagamento> listaFolhaPagamento = new List<FolhaDePagamento>();
                List<SerializedFolhaPagamento> listaFolhaPagamentoSerializado = new List<SerializedFolhaPagamento>();
                listaFolhaPagamento = gerenciamento.ConsultarFolhaDePagamento(idFuncionario, dataInicial, dataFinal);
                foreach (var FolhaDePagamento in listaFolhaPagamento)
                {
                    var folhaPagamentoSerializado = new SerializedFolhaPagamento(FolhaDePagamento);
                    listaFolhaPagamentoSerializado.Add(folhaPagamentoSerializado);
                }
                return listaFolhaPagamentoSerializado;
            }
            catch (Exception) { return null; }
        }
        #endregion

        #region Boleto
        [WebMethod]
        public SerializedBoleto GetBoleto(string nomeCliente, string nomeBanco, string idPaciente, DateTime inicio, DateTime final)
        {
            try
            {
                GerarBoleto boletogenerator = new GerarBoleto();
                SerializedBoleto boleto = new SerializedBoleto((boletogenerator.GetBoleto(nomeCliente, nomeBanco, idPaciente, inicio, final)));
                return boleto;
            }
            catch (Exception) { return null; }
        }
        #endregion

        #region NotaFiscal
        [WebMethod]
        public List<SerializedDespesa> getNotaFiscal(string idPaciente, DateTime inicio, DateTime final)
        {
            try
            {
                GerarNotaFiscal notafiscal = new GerarNotaFiscal();
                List<Despesa> desp = notafiscal.getNotaFiscal(idPaciente, inicio, final);
                List<SerializedDespesa> despe = new List<SerializedDespesa>();
                foreach (Despesa d in desp)
                {
                    despe.Add(new SerializedDespesa(d));
                }
                return despe;
            }
            catch { return null; }
        }

        #endregion

        #region CRUD Departamentos
        [WebMethod]
        public SerializedDepartamento cadastrarDepartamento(String nome)
        {
            try
            {
                GerenciamentoDepartamentos geren = new GerenciamentoDepartamentos();
                var depto = geren.CadastrarDepartamento(nome);
                return new SerializedDepartamento(depto);
            }
            catch { return null; }
        }

        [WebMethod]
        public bool apagarDepartamento(int idDepartamento)
        {
            try
            {
                GerenciamentoDepartamentos geren = new GerenciamentoDepartamentos();
                geren.ApagarDepartamento(idDepartamento);
                return true;
            }
            catch { return false; }
        }

        [WebMethod]
        public bool atualizarDepartamento(int idDepartamento, string novonome)
        {
            try
            {
                GerenciamentoDepartamentos geren = new GerenciamentoDepartamentos();
                geren.AtualizaDepartamento(idDepartamento, novonome);
                return true;
            }
            catch { return false; }
        }

        [WebMethod]
        public List<SerializedDepartamento> visualizarDepartamentos()
        {
            try
            {
                List<SerializedDepartamento> departamentos = new List<SerializedDepartamento>();
                GerenciamentoDepartamentos geren = new GerenciamentoDepartamentos();

                foreach (Departamento g in geren.ListaDepartamentos())
                {
                    departamentos.Add(new SerializedDepartamento(g));
                }

                return departamentos;
            }
            catch { return null; }  
        }

        [WebMethod]
        public List<SerializedDepartamento> visualizarDepartamentoPorNome(string nome)
        {
            try
            {
                var geren = new GerenciamentoDepartamentos();
                var deptos = geren.ListaDepartamentos(nome);

                var sDeptos = new List<SerializedDepartamento>();
                foreach (var depto in deptos)
                    sDeptos.Add(new SerializedDepartamento(depto));
                return sDeptos;
            }
            catch { return null; }
        }
        #endregion


        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        #region p/ Estoque

        [WebMethod]
        public string PedirAutorizacaoCompraEstoque(string idProduto, decimal preco)
        {
            return Guid.NewGuid().ToString();
        }

        [WebMethod]
        public bool CancelarCompraEstoque(string idAutorizacao)
        {
            return true;
        }

        #endregion

        #region p/ Controle Prontuário

        [WebMethod]
        public bool ReceberInicioAtendimentoMedico(int idMedico, string idPaciente)
        {
            try
            {
                var na = new NotificacaoAtendimento();
                na.ReceberInicioAtendimento(idMedico, idPaciente);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public bool ReceberFimAtendimentoMedico(int idMedico, string idPaciente)
        {
            try
            {
                var na = new NotificacaoAtendimento();
                na.ReceberFimAtendimento(idMedico, idPaciente);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public bool ReceberInicioAtendimentoFisioterapeuta(int idFisioterapeuta, string idPaciente)
        {
            try
            {
                var na = new NotificacaoAtendimento();
                na.ReceberInicioAtendimento(idFisioterapeuta, idPaciente);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public bool ReceberFimAtendimentoFisioterapeuta(int idFisioterapeuta, string idPaciente)
        {
            try
            {
                var na = new NotificacaoAtendimento();
                na.ReceberFimAtendimento(idFisioterapeuta, idPaciente);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        [WebMethod]
        public bool ReceberConclusaoProcedimentoMedico(string idPaciente, List<string> idItensConsumidos)
        {
            return true;
        }

        #endregion
    }
}